home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1996 #1 / Amiga Plus CD - 1996 - No. 1.iso / pd / netz / xbtx_v1.1 / textdisplay.cpp < prev    next >
C/C++ Source or Header  |  1995-09-26  |  14KB  |  497 lines

  1. /*
  2. **    $Id: TextDisplay.cpp 1.4 1995/09/26 19:45:11 olsen Exp olsen $
  3. **
  4. **    :ts=4
  5. */
  6.  
  7. /*
  8.  * Amiga changes copyright © 1995 by Olaf Barthel, All Rights Reserved
  9.  *
  10.  * Copyright (c) 1992, 1993 Arno Augustin, Frank Hoering, University of
  11.  * Erlangen-Nuremberg, Germany.
  12.  * All rights reserved.
  13.  *
  14.  * Redistribution and use in source and binary forms, with or without
  15.  * modification, are permitted provided that the following conditions
  16.  * are met:
  17.  * 1. Redistributions of source code must retain the above copyright
  18.  *    notice, this list of conditions and the following disclaimer.
  19.  * 2. Redistributions in binary form must reproduce the above copyright
  20.  *    notice, this list of conditions and the following disclaimer in the
  21.  *    documentation and/or other materials provided with the distribution.
  22.  * 3. All advertising materials mentioning features or use of this software
  23.  *    must display the following acknowledgement:
  24.  *    This product includes software developed by the University of
  25.  *    Erlangen-Nuremberg, Germany.
  26.  * 4. Neither the name of the University nor the names of its contributors
  27.  *    may be used to endorse or promote products derived from this software
  28.  *    without specific prior written permission.
  29.  *
  30.  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
  31.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  32.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
  33.  * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  34.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  36.  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  37.  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  38.  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  39.  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  40.  *
  41.  * This software has not been validated by the ``Bundesamt fuer Zulassungen in
  42.  * der Telekommunikation'' of the ``Deutsche Bundepost Telekom'' and thus
  43.  * must not be used for accessing the BTX-Network of the Telekom in Germany.
  44.  *
  45.  * Diese Software hat keine Zulassung durch das Bundesamt fuer Zulassungen in
  46.  * der Telekommunikation der Deutschen Bundespost Telekom und darf daher nicht
  47.  * am Netz der Deutschen Bundespost Telekom in Deutschland betrieben werden.
  48.  */
  49.  
  50. #include "TextDisplay.hpp"
  51. #include "Font.h"
  52. #include "RawKeys.h"
  53.  
  54. /****************************************************************************/
  55.  
  56. #include <clib/intuition_protos.h>
  57. #include <clib/graphics_protos.h>
  58. #include <clib/utility_protos.h>
  59. #include <clib/keymap_protos.h>
  60. #include <clib/exec_protos.h>
  61. #include <clib/dos_protos.h>
  62. #include <clib/macros.h>
  63.  
  64. #ifdef __SASC
  65. #include <pragmas/intuition_pragmas.h>
  66. #include <pragmas/graphics_pragmas.h>
  67. #include <pragmas/utility_pragmas.h>
  68. #include <pragmas/keymap_pragmas.h>
  69. #include <pragmas/exec_pragmas.h>
  70. #include <pragmas/dos_pragmas.h>
  71.  
  72. extern struct IntuitionBase *IntuitionBase;
  73. extern struct GfxBase        *GfxBase;
  74. extern struct ExecBase        *SysBase;
  75. extern struct DosLibrary    *DOSBase;
  76. extern struct Library        *KeymapBase;
  77. extern struct Library        *UtilityBase;
  78. #endif    // __SASC
  79.  
  80. #include <string.h>
  81. #include <stdio.h>
  82.  
  83. /****************************************************************************/
  84.  
  85. #define SPREAD(v) ((((ULONG)v) << 24) | (((ULONG)v) << 16) | (((ULONG)v) << 8) | ((ULONG)v))
  86.  
  87. TextDisplay::TextDisplay()
  88. {
  89.     Window    = NULL;
  90.     Font    = NULL;
  91. }
  92.  
  93. TextDisplay::~TextDisplay()
  94. {
  95.     Close();
  96. }
  97.  
  98. VOID TextDisplay::Close(VOID)
  99. {
  100.     if(Window)
  101.     {
  102.         CloseWindow(Window);
  103.         Window = NULL;
  104.     }
  105.  
  106.     if(Font)
  107.     {
  108.         CloseFont(Font);
  109.         Font = NULL;
  110.     }
  111. }
  112.  
  113. LONG TextDisplay::Open(STRPTR PubScreenName,int XScale,int YScale,BOOL DirectRender)
  114. {
  115.     extern struct GfxBase *GfxBase;
  116.  
  117.     struct TextAttr SystemText;
  118.  
  119.     SystemText.ta_Name    = GfxBase->DefaultFont->tf_Message.mn_Node.ln_Name;
  120.     SystemText.ta_YSize    = GfxBase->DefaultFont->tf_YSize;
  121.     SystemText.ta_Style    = GfxBase->DefaultFont->tf_Style;
  122.     SystemText.ta_Flags    = GfxBase->DefaultFont->tf_Flags;
  123.  
  124.     if(Font = OpenFont(&SystemText))
  125.     {
  126.         FontWidth    = Font->tf_XSize;
  127.         FontHeight    = Font->tf_YSize;
  128.  
  129.         if(Window = OpenWindowTags(NULL,
  130.             WA_DragBar,                TRUE,
  131.             WA_DepthGadget,            TRUE,
  132.             WA_CloseGadget,            TRUE,
  133.             WA_Title,                "xBTX",
  134.             WA_InnerWidth,            40 * FontWidth,
  135.             WA_InnerHeight,            24 * FontHeight,
  136.             WA_RMBTrap,                TRUE,
  137.             WA_IDCMP,                IDCMP_MOUSEBUTTONS | IDCMP_RAWKEY | IDCMP_CLOSEWINDOW,
  138.             WA_Activate,            TRUE,
  139.             WA_AutoAdjust,            FALSE,
  140.             WA_PubScreenName,        PubScreenName,
  141.             WA_PubScreenFallBack,    TRUE,
  142.         TAG_DONE))
  143.         {
  144.             struct DrawInfo *DrawInfo;
  145.  
  146.             if(DrawInfo = GetScreenDrawInfo(Window -> WScreen))
  147.             {
  148.                 FgPen    = DrawInfo -> dri_Pens[TEXTPEN];
  149.                 BgPen    = DrawInfo -> dri_Pens[BACKGROUNDPEN];
  150.  
  151.                 MaxPen    = MAX(FgPen,BgPen);
  152.  
  153.                 RPort = Window->RPort;
  154.  
  155.                 SetFont(RPort,Font);
  156.  
  157.                 SetMaxPen(RPort,MaxPen);
  158.  
  159.                 SetABPenDrMd(RPort,BgPen,0,JAM1);
  160.                 RectFill(RPort,Window->BorderLeft,Window->BorderTop,Window->Width - (Window->BorderRight+1),Window->Height - (Window->BorderBottom+1));
  161.  
  162.                 SetABPenDrMd(RPort,FgPen,BgPen,JAM2);
  163.  
  164.                 WindowPort = Window->UserPort;
  165.                 WindowMask = 1UL << WindowPort->mp_SigBit;
  166.  
  167.                 FreeScreenDrawInfo(Window -> WScreen,DrawInfo);
  168.  
  169.                 ScreenToFront(Window->WScreen);
  170.  
  171.                 return(0);
  172.             }
  173.  
  174.             CloseWindow(Window);
  175.             Window = NULL;
  176.         }
  177.         else
  178.         {
  179.             CloseFont(Font);
  180.             Font = NULL;
  181.         }
  182.     }
  183.  
  184.     return(-1);
  185. }
  186.  
  187. VOID TextDisplay::PutLine(STRPTR Line)
  188. {
  189.     if(Line)
  190.     {
  191.         int i,len;
  192.  
  193.         SetAPen(RPort,BgPen);
  194.         RectFill(RPort,Window->BorderLeft,Window->BorderTop + PutIndex * FontHeight,Window->Width - (Window->BorderRight + 1),Window->BorderTop + (PutIndex + 1) * FontHeight - 1);
  195.         SetAPen(RPort,FgPen);
  196.  
  197.         if((len = (int)strlen(Line)) > 40)
  198.             len = 40;
  199.  
  200.         for(i = 0 ; i < len ; i++)
  201.             xputc(Line[i],0,i,PutIndex,0,0,0,0,7,0);
  202.  
  203.         PutIndex = (WORD)((PutIndex + 1) % (*rows));
  204.     }
  205.     else
  206.     {
  207.         PutIndex = 0;
  208.         xclearscreen();
  209.     }
  210. }
  211.  
  212. void TextDisplay::xputc(int c,int s,int x,int y,int xdouble,int ydouble,int underline,int d,int fg,int bg)
  213. {
  214.    static unsigned char supp_map[96] =
  215.       { ' ', 0xa1, 0xa2, 0xa3, '$', 0xa5, '#', 0xa7, 0xa4, '`', '\"', 0xab,
  216.     0, 0, 0, 0, 0xb0, 0xb1, 0xb2, 0xb3, 0xd7, 0xb5, 0xb6, 0xb7, 0xf7,
  217.     '\'', '\"', 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0, 0x60, 0x27, 0, '~',
  218.     0xaf, 0, 0, 0x22, 0x22, 0xb0, 0, 0, 0x22, 0xb8, 0, 0xad, 0xb9, 0xae,
  219.     0xa9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xc6, 0, 0, 0, 0, 0,
  220.     0, 0, 0xd8, 0, 0, 0xfe, 0, 0, 0, 0, 0xe6, 0, 0, 0, 0, 0, 0, 0, 0xf8,
  221.     0, 0xdf, 0xde, 0, 0, 0 };
  222.  
  223.    static unsigned char diacritical_map[26*2][16] = {
  224.     { 0, 0xc0, 0xc1, 0xc2, 0xc3, 0, 0, 0, 0xc4, 0xc4, 0xc5, 0, 0, 0xc4, 0, 0 },
  225.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },     /* B */
  226.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xc7, 0, 0, 0, 0 },
  227.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* D */
  228.     { 0, 0xc8, 0xc9, 0xca, 0, 0, 0, 0, 0xcb, 0xcb, 0, 0, 0, 0xcb, 0, 0 },
  229.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  230.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  231.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* H */
  232.     { 0, 0xcc, 0xcd, 0xce, 0, 0, 0, 0, 0xcf, 0xcf, 0, 0, 0, 0xcf, 0, 0 },
  233.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  234.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  235.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  236.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  237.     { 0, 0, 0, 0, 0xd1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* N */
  238.     { 0, 0xd2, 0xd3, 0xd4, 0xd5, 0, 0, 0, 0xd6, 0xd6, 0, 0, 0, 0xd6, 0, 0 },
  239.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  240.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  241.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  242.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  243.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* T */
  244.     { 0, 0xd9, 0xda, 0xdb, 0, 0, 0, 0, 0xdc, 0xdc, 0, 0, 0, 0xdc, 0, 0 },
  245.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  246.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  247.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* X */
  248.     { 0, 0, 0xdd, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  249.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  250.     { 0, 0xe0, 0xe1, 0xe2, 0xe3, 0, 0, 0, 0xe4, 0xe4, 0xe5, 0, 0, 0xe4, 0, 0 },
  251.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  252.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xe7, 0, 0, 0, 0 },  /* c */
  253.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  254.     { 0, 0xe8, 0xe9, 0xea, 0, 0, 0, 0, 0xeb, 0xeb, 0, 0, 0, 0xeb, 0, 0 },
  255.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  256.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  257.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* h */
  258.     { 0, 0xec, 0xed, 0xee, 0, 0, 0, 0, 0xef, 0xef, 0, 0, 0, 0xef, 0, 0 },
  259.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  260.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  261.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  262.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  263.     { 0, 0, 0, 0, 0xf1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* n */
  264.     { 0, 0xf2, 0xf3, 0xf4, 0xf5, 0, 0, 0, 0xf6, 0xf6, 0, 0, 0, 0xf6, 0, 0 },
  265.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  266.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  267.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  268.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  269.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* t */
  270.     { 0, 0xf9, 0xfa, 0xfb, 0, 0, 0, 0, 0xfc, 0xfc, 0, 0, 0, 0xfc, 0, 0 },
  271.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  272.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  273.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  274.     { 0, 0, 0xfd, 0, 0, 0, 0, 0, 0xff, 0xff, 0, 0, 0, 0xff, 0, 0 },  /* y */
  275.     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
  276.  
  277.     if(x<0 || y<0 || x>39 || y>(*rows)-1)
  278.         return;
  279.     else
  280.     {
  281.         UBYTE Char;
  282.  
  283.         /* ASCII out of  1st supplementary set of mosaic characters */
  284.         if(s==SUP1 && c>=0x40 && c<=0x5f)
  285.             Char = (UBYTE)c;
  286.         else
  287.             Char = (UBYTE)' ';
  288.  
  289.         /* supplementary set of graphic characters */
  290.         if(s==SUPP && supp_map[c-0x20])
  291.             Char = (UBYTE)supp_map[c-0x20];
  292.         else
  293.         {
  294.             /* composed characters, diacritical marks (page 123) */
  295.             if(s==PRIM)
  296.             {
  297.                 if(!d)
  298.                     Char = (UBYTE)c;  /* ASCII character */
  299.                 else
  300.                 {
  301.                     if(d>=0x40 && d<=0x4f)
  302.                     {
  303.                         if(c>=0x41 && c<=0x5a && diacritical_map[c-0x41][d&0xf])
  304.                             Char = (UBYTE)diacritical_map[c-0x41][d&0xf];
  305.                         else
  306.                         {
  307.                             if(c>=0x61 && c<=0x7a && diacritical_map[c-0x61+26][d&0xf])
  308.                                 Char = (UBYTE)diacritical_map[c-0x61+26][d&0xf];
  309.                         }
  310.                     }
  311.                 }
  312.             }
  313.         }
  314.  
  315.         PutChar(Char,x,y);
  316.  
  317.         if(xdouble)
  318.         {
  319.             PutChar((UBYTE)' ',x + 1,y);
  320.  
  321.             if(ydouble)
  322.             {
  323.                 PutChar((UBYTE)' ',x,y + 1);
  324.                 PutChar((UBYTE)' ',x + 1,y + 1);
  325.             }
  326.         }
  327.         else
  328.         {
  329.             if(ydouble)
  330.                 PutChar((UBYTE)' ',x,y + 1);
  331.         }
  332.     }
  333. }
  334.  
  335. void TextDisplay::xclearscreen()
  336. {
  337.     SetAPen(RPort,BgPen);
  338.     RectFill(RPort,Window->BorderLeft,Window->BorderTop,Window->Width - (Window->BorderRight + 1),Window->Height - (Window->BorderBottom + 1));
  339.     SetAPen(RPort,FgPen);
  340. }
  341.  
  342. void TextDisplay::xcursor(int x,int y)
  343. {
  344.     SetABPenDrMd(RPort,-1,0,JAM1 | COMPLEMENT);
  345.     SetMaxPen(RPort,-1);
  346.  
  347.     RectFill(RPort,Window->BorderLeft + x*FontWidth,Window->BorderTop + y*FontHeight,Window->BorderLeft + x*FontWidth + FontWidth-1,Window->BorderTop + y*FontHeight + FontHeight-1);
  348.  
  349.     SetMaxPen(RPort,MaxPen);
  350.     SetABPenDrMd(RPort,FgPen,BgPen,JAM2);
  351. }
  352.  
  353. /******************************************************************************/
  354.  
  355. ULONG TextDisplay::WaitMask(VOID)
  356. {
  357.     return(WindowMask);
  358. }
  359.  
  360. LONG TextDisplay::Waiting(VOID)
  361. {
  362.     if(WaitingChar == -1)
  363.     {
  364.         struct IntuiMessage *Message;
  365.  
  366.         while(Message = (struct IntuiMessage *)GetMsg(WindowPort))
  367.         {
  368.             if(Message->Class == IDCMP_RAWKEY)
  369.             {
  370.                 if((WaitingChar = (WORD)MapKey(Message)) >= 0)
  371.                 {
  372.                     ReplyMsg((struct Message *)Message);
  373.  
  374.                     return(1);
  375.                 }
  376.             }
  377.             else
  378.             {
  379.                 if(Message->Class == IDCMP_CLOSEWINDOW)
  380.                 {
  381.                     ReplyMsg((struct Message *)Message);
  382.  
  383.                     WaitingChar = '\033';
  384.  
  385.                     return(1);
  386.                 }
  387.             }
  388.  
  389.             ReplyMsg((struct Message *)Message);
  390.         }
  391.  
  392.         return(0);
  393.     }
  394.     else
  395.         return(1);
  396. }
  397.  
  398. LONG TextDisplay::GetChar(VOID)
  399. {
  400.     if(WaitingChar == -1)
  401.     {
  402.         struct IntuiMessage *Message;
  403.  
  404.         while(Message = (struct IntuiMessage *)GetMsg(WindowPort))
  405.         {
  406.             if(Message->Class == IDCMP_RAWKEY)
  407.             {
  408.                 LONG Result = MapKey(Message);
  409.  
  410.                 ReplyMsg((struct Message *)Message);
  411.  
  412.                 return(Result);
  413.             }
  414.             else
  415.             {
  416.                 if(Message->Class == IDCMP_CLOSEWINDOW)
  417.                 {
  418.                     ReplyMsg((struct Message *)Message);
  419.  
  420.                     return('\033');
  421.                 }
  422.             }
  423.  
  424.             ReplyMsg((struct Message *)Message);
  425.         }
  426.  
  427.         return(-1);
  428.     }
  429.     else
  430.     {
  431.         LONG Result = WaitingChar;
  432.  
  433.         WaitingChar = -1;
  434.  
  435.         return(Result);
  436.     }
  437. }
  438.  
  439. LONG TextDisplay::MapKey(struct IntuiMessage *Message)
  440. {
  441.     static LONG Table[][2] =
  442.     {
  443.         RAWKEY_CursorUp,    KEY_CursorUp,
  444.         RAWKEY_CursorDown,    KEY_CursorDown,
  445.         RAWKEY_CursorRight, KEY_CursorRight,
  446.         RAWKEY_CursorLeft,    KEY_CursorLeft,
  447.  
  448.         RAWKEY_Help,        KEY_Help,
  449.  
  450.         RAWKEY_F1,            -1,
  451.         RAWKEY_F2,            -1,
  452.         RAWKEY_F3,            -1,
  453.         RAWKEY_F4,            -1,
  454.         RAWKEY_F5,            -1,
  455.         RAWKEY_F6,            -1,
  456.         RAWKEY_F7,            -1,
  457.         RAWKEY_F8,            -1,
  458.         RAWKEY_F9,            -1,
  459.         RAWKEY_F10,         -1,
  460.  
  461.         -1
  462.     };
  463.  
  464.     UBYTE Buffer[10];
  465.     WORD i;
  466.  
  467.     for(i = 0 ; Table[i][0] != -1 ; i++)
  468.     {
  469.         if((Message->Code & ~IECODE_UP_PREFIX) == Table[i][0])
  470.         {
  471.             if(Message->Code & IECODE_UP_PREFIX)
  472.                 return(-1);
  473.             else
  474.                 return(Table[i][1]);
  475.         }
  476.     }
  477.  
  478.     Event.ie_Class        = IECLASS_RAWKEY;
  479.     Event.ie_SubClass     = 0;
  480.     Event.ie_Code         = Message->Code;
  481.     Event.ie_Qualifier    = Message->Qualifier;
  482.     Event.ie_EventAddress = (APTR *) *((ULONG *)Message->IAddress);
  483.  
  484.     Buffer[0] = 0;
  485.  
  486.     if(MapRawKey(&Event,(char *)&Buffer[0],10,(struct KeyMap *)NULL) > 0)
  487.         return(Buffer[0]);
  488.     else
  489.         return(-1);
  490. }
  491.  
  492. VOID TextDisplay::PutChar(UBYTE c,int x,int y)
  493. {
  494.     Move(RPort,Window->BorderLeft + x * FontWidth,Window->BorderTop + y * FontHeight + RPort->TxBaseline);
  495.     Text(RPort,(STRPTR)&c,1);
  496. }
  497.